/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mware_lib;

import java.io.IOException;
import mware_lib.Communicator.Connection;

/**
 * dieser thread wird für jeden objektbroker gestartet. er nimmt alle einkommenden
 * "nachrichten" des request reply protokolls entgegen
 * @author safe
 */
public class RequestThread extends Thread {

    private Connection connection;
    private IBaseSkeleton skeleton;
    private ObjectBroker broker;

    /**
     * wird so nur von nameservice benutzt, da es nur einen skeleton geben
     * kann können wir diesen einfach erzeugen (muss keine auswahl mehr 
     * getroffen werden)
     * @param connection
     * @param skeleton 
     */
    public RequestThread(Connection connection, IBaseSkeleton skeleton) {
        this.connection = connection;
        this.skeleton = skeleton;
    }

    /**
     * hier muss noch ermittelt werden welcher skeleton diese nachricht 
     * bearbeiten kann - daher brauchen wir den broker
     * @param connection
     * @param broker 
     */
    public RequestThread(Connection connection, ObjectBroker broker) {
        this.connection = connection;
        this.broker = broker;
    }

    /**
     * connection schliessen um thread beenden zu können
     * @throws IOException 
     */
    protected void shutDownSocket() throws IOException {
        connection.close();
    }

    /**
     * skeleton kann null sein wenn der request thread nicht durch den namensdiesnt
     * erstellt wurde. 
     * bei fehlendem skeleton wird die objektreferenz(in nachricht kodiert) ausgelesen. damit
     * dann im lokalen referenzmodul (durch broker) nach einer objektreferenz mit typ ibaseskeleton
     * suchen, die auf die codierte referenz abgebildet ist.
     * wenn skeleton immer noch null, dann kein eintrag vorhanden ELSE remoteinvoke auf skeleton
     * 
     */
    @Override
    public void run() {

        try {
            String message = connection.receive();

            if (skeleton == null) {
                String ref = StringDecoder.getReferenceByMessage(message);
                skeleton = broker.getSkeletonByReference(ref);
                message = StringDecoder.extractMessage(message);
            }

            if (skeleton != null) {
                String reply = skeleton.remoteInvoke(message);
                connection.send(reply);
            } else {
                System.err.println("RequestThread: SKELETON nicht gefunden.");
                connection.send("exception:exception;returntyp:RuntimeException;returnvalue: Obejkt nicht im Referenzmodul verfügbar");
            }
            connection.close();

        } catch (IOException ex) {
            System.err.println("RequestThread: Verbindung zwischen Proxy und Skeleton fehlgeschlagen.");
//            Thread.currentThread().interrupt();
        }
    }
}
